package EA.operators.mutation;
import EA.*;

/** Abstract super class for mutation on numerical genomes. */
public class NumMutation
{

  /** Mutate all entries in the given vector. 
      @param genome The NumericalGenome to mutate.
      @param params An array of parameters for the mutation
      operator. Specified in extending classes.
   */
  public static void mutateAll(NumericalGenome genome, double[] params)
    {
      System.out.println("mutateAll(NumericalGenome genome, double[] params) is not implemented!");
      System.exit(0);
    }

  /** Mutate all entries in the given vector. 
      @param genome The NumericalGenome to mutate.
      @param params1 An array of parameters for the mutation
      operator. Specified in extending classes.
      @param params2 An array of parameters for the mutation
      operator. Specified in extending classes.
   */
  public static void mutateAll(NumericalGenome genome, double[] params1, double[] params2)
    {
      System.out.println("mutateAll(NumericalGenome genome, double[] params1, double[] params2) is not implemented!");
      System.exit(0);
    }

  /** Mutate a fraction of a given vector. 
      @param genome The NumericalGenome to mutate.
      @param params An array of parameters for the mutation
      operator. Specified in extending classes.
   */
  public static void mutateFraction(NumericalGenome genome, double[] params)
    {
      System.out.println("mutateFraction(NumericalGenome genome, double[] params) is not implemented!");
      System.exit(0);
    }

  /** Mutate a fraction of a given vector. 
      @param genome The NumericalGenome to mutate.
      @param params1 An array of parameters for the mutation
      operator. Specified in extending classes.
      @param params2 An array of parameters for the mutation
      operator. Specified in extending classes.
   */
  public static void mutateFraction(NumericalGenome genome, double[] params1, double[] params2)
    {
      System.out.println("mutateFraction(NumericalGenome genome, double[] params1, double[] params2) is not implemented!");
      System.exit(0);
    }

  /** Mutate a given number of entries in the given vector. 
      @param genome The NumericalGenome to mutate.
      @param params An array of parameters for the mutation
      operator. Specified in extending classes.
   */
  public static void mutateFixedNumber(NumericalGenome genome, double[] params)
    {
      System.out.println("mutateFixedNumber(NumericalGenome genome, double[] params) is not implemented!");
      System.exit(0);
    }

  /** Mutate a given number of entries in the given vector. 
      @param genome The NumericalGenome to mutate.
      @param params1 An array of parameters for the mutation
      operator. Specified in extending classes.
      @param params2 An array of parameters for the mutation
      operator. Specified in extending classes.
   */
  public static void mutateFixedNumber(NumericalGenome genome, double[] params1, double[] params2)
    {
      System.out.println("mutateFixedNumber(NumericalGenome genome, double[] params1, double[] params2) is not implemented!");
      System.exit(0);
      genome.fitnesscalculated = false;
    }

  /** Mutate entries in the given vector such that each entry has a
      low probability of being mutated. A randomized check should be made
      for each entry.
      @param genome The NumericalGenome to mutate.
      @param params An array of parameters for the mutation
      operator. Specified in extending classes.  */
  public static void mutateRollEach(NumericalGenome genome, double[] params)
    {
      System.out.println("mutateRollEach(NumericalGenome genome, double[] params) is not implemented!");
      System.exit(0);
    }


  /** Mutate entries in the given vector such that each entry has a
      low probability of being mutated. A randomized check should be made
      for each entry.
      @param genome The NumericalGenome to mutate.
      @param params1 An array of parameters for the mutation
      operator. Specified in extending classes.
      @param params2 An array of parameters for the mutation
      operator. Specified in extending classes.
  */
  public static void mutateRollEach(NumericalGenome genome, double[] params1, double[] params2)
    {
      System.out.println("mutateRollEach(NumericalGenome genome, double[] params1, double[] params2) is not implemented!");
      System.exit(0);
    }
}
